構成管理ツール Ansibleを使ってみる
構成管理ツールといえばChefですが
弊社ブログでも構成管理ツールに関する記事はけっこうありますが、ほとんどがChefに関する記事です。 私もChefについてを書いてたりしますが、Rubyが苦手な自分としては、Chefのレシピを書いたりするのは難しいわけです。 (こういう記事もありますが) で、Chefのかわりに使えそうな構成管理ツールを探して、これならいけるんじゃないかと思ったのが、今回紹介するAnsibleです。
Ansibleとは
Ansibleとは、Pythonで記述された構成管理ツールです。 まずはAnsibleの基本用語について解説します。
・モジュール クライアント内での動きは「モジュール」として定義されます。 ソフトウェアをインストールしたり、サービスの起動をしたりするモジュールはあらかじめ用意されてます。 自分でモジュールを作成することも可能です。 このモジュールは何で作成してもいいので、Pythonの知識は必要ないです。 決められた出力形式(key-value形式かJSON)を守ればOKみたいです。
・Play book Chefでいうところのレシピ。モジュール処理をまとめたものが「Play book」と呼ばれます。 Play bookはYAML形式で記述します。
基本的にChefは、クライアントとサーバで構成され、ChefクライアントからChefサーバーに対して設定を 問い合わせながら自身を変更していき、定義した状態にしていきます。 Ansibleでは、サーバからクライアント(複数の可能性もある)に対して直接命令し、結果を取得します。 したがって、各クライアントではAnsibleをインストールする必要はありません。
環境構築方法
今回使用した動作環境は以下のとおりです。Virtual boxとVagrantは使用できる状態にしておいてください。
- OS : MacOS X 10.9.3
- Virtual box: 4.3.6
- Vagrant: 1.6.3
今回は結局Vagrant使ってるので、rubyで設定ファイルを書いてるのですが・・・
Ansibleを使ってみる
ここを参考に、Ansibleをセットアップして使ってみましょう。 VagrantでCentOSマシンを2台用意し、片方に向けてAnsibleでいろいろしてみます。
1.Vagrantで仮想マシン作成
まずはCentOSマシンを2台用意します。下記コマンドを実行し、仮想マシンを2台起動しましょう。 node1からnode2にAnsibleを実行するため、鍵ファイルのコピーも行います。
% vagrant box add CentOS65 https://github.com/2creatives/vagrant-centos/releases/download/v6.5.3/centos65-x86_64-20140116.box % vagrant init CentOS65
Vagrantfileを下記のように編集します。
・ ・ config.vm.define :node1 do |node| node.vm.box = "CentOS65" node.vm.network :forwarded_port, guest: 22, host: 2001, id: "ssh" node.vm.network :private_network, ip: "192.168.33.11" end config.vm.define :node2 do |node| node.vm.box = "CentOS65" node.vm.network :forwarded_port, guest: 22, host: 2002, id: "ssh" node.vm.network :forwarded_port, guest: 80, host: 8000, id: "http" node.vm.network :private_network, ip: "192.168.33.12" end ・ ・
Vagrantfileを編集したら、仮想マシンを起動します。 vagrant sshでログインできることも確認しておいてください。
% vagrant up % vagrant ssh node1 Last login: Mon Jun 30 06:23:19 2014 from 10.0.2.2 [vagrant@vagrant-centos65 ~]$
マシンが起動したら、node1からnode2へsshできるように下記コマンドを実行しておきます。
% vagrant ssh-config node1 > ssh_config % vagrant ssh-config node2 >> ssh_config % scp -F ssh_config ~/.vagrant.d/insecure_private_key node1:.ssh/id_rsa
2.CentOSにAnsibleをインストール
セットアップしたCentOSにはすでにpythonがインストールされているので、 yumでAnsibleをインストールするだけで使用できます。 node1マシンにsshログインし、yumでAnsibleをインストールします。
% vagrant ssh node1 [vagrant@vagrant-centos65 ~]$ sudo yum install ansible -y
Ansibleを実行するには、inventory fileに対象サーバのアドレスを登録しなければいけません。 hostsという名前で、下記内容のファイルを記述します。
[test-server] 192.168.33.12
3.Ansibleでコマンド実行
では、node2サーバに対してAnsibleでコマンドを実行してみましょう。 test-serverグループに対して、pingコマンド(モジュール)を実行しており、結果を受け取っています。
[vagrant@vagrant-centos65 ~]$ ansible test-server -i hosts -m ping 192.168.33.12 | success >> { "changed": false, "ping": "pong" }
4.任意のコマンドを実行
Ansibleで任意のLinuxコマンドを実行したい場合もあります。その場合には、「-a」オプションを使って コマンドを文字列で指定します。
[vagrant@vagrant-centos65 ~]$ ansible test-server -i hosts -a "cat /etc/redhat-release" 192.168.33.12 | success | rc=0 >> CentOS release 6.5 (Final)
今回は実行するサーバは1台だけですが、サーバの台数が多い場合にはコマンドをまとめて実行できるので便利ですね。
5.Play bookを使う
複数のモジュールをまとめたものをPlay bookといいます。 Apache httpdをインストールしてサービスを実行するPlay bookを記述して、実行してみましょう。 simple.ymlという名前で、下記ファイルを作成します。
--- - hosts: test-server sudo: yes tasks: - name: be sure httpd is installed yum: name=httpd state=installed - name: be sure httpd is running and enabled service: name=httpd state=running enabled=yes
tasks以下に実行したい処理を記述します。ここではyumとserviceモジュールを実行しています。
play bookを実行するには、ansible-playbookコマンドを実行します。 下記のように--list-tasksオプションを指定すると、ymlで実行される内容を確認することができます。
[vagrant@vagrant-centos65 ~]$ ansible-playbook -i hosts simple.yml --list-tasks playbook: simple.yml play #1 (test-servers): be sure httpd is installed be sure httpd is running and enabled
では実際にPlay bookを実行します。ansible-playbookコマンドを実行すると、node2に対して Apacheのインストールとサービス起動が実行されます。
[vagrant@vagrant-centos65 ~]$ ansible-playbook -i hosts simple.yml PLAY [test-server] ************************************************************ GATHERING FACTS *************************************************************** ok: [192.168.33.12] TASK: [be sure httpd is installed] ******************************************** changed: [192.168.33.12] TASK: [be sure httpd is running and enabled] ********************************** changed: [192.168.33.12] PLAY RECAP ******************************************************************** 192.168.33.12 : ok=3 changed=2 unreachable=0 failed=0
node2にログインし、Apacheがインストールされているのを確認してみてください。
% vagrant ssh node2 [vagrant@vagrant-centos65 ~]$ sudo service httpd status httpd (pid 8552) is running...
まとめ
ymlで簡単にマシンに対する処理が記述できますし、言語を問わずモジュールが記述できるのも便利ですね。 構成管理ツールとして、Ansibleの採用も検討してみてください。
参考サイトなど
- 構成管理ツール Ansible を使ってみる: http://d.hatena.ne.jp/akishin999/20130814/1376432403
- Ansible Tutorial: http://yteraoka.github.io/ansible-tutorial/
- 今日からすぐに使えるデプロイ・システム管理ツール ansible 入門: http://tdoc.info/blog/2013/05/10/ansible_for_beginners.html